package com.drug.lib.util.web;

import android.content.Context;
import android.graphics.Bitmap;
import android.view.View;

import com.drug.lib.base.BaseApplication;
import com.drug.lib.util.DLog;
import com.tencent.smtt.export.external.interfaces.IX5WebChromeClient;
import com.tencent.smtt.sdk.CookieManager;
import com.tencent.smtt.sdk.GeolocationPermissions;
import com.tencent.smtt.sdk.WebChromeClient;
import com.tencent.smtt.sdk.WebIconDatabase;
import com.tencent.smtt.sdk.WebSettings;
import com.tencent.smtt.sdk.WebStorage;
import com.tencent.smtt.sdk.WebView;
import com.tencent.smtt.sdk.WebViewClient;
import com.tencent.smtt.sdk.WebViewDatabase;

public class X5Utils {
    private WebView mWebView;
    private AndroidJs androidJs;
    private MyWebChromeClient mMyWebChromeClient;

    public X5Utils(WebView mWebView, AndroidJs androidJs) {
        this.mWebView = mWebView;
        this.androidJs = androidJs;
    }

    public void initWebView() {
        WebSettings settings = mWebView.getSettings();
        //设置了这个属性后我们才能在 WebView 里与我们的 Js 代码进行交互
        settings.setJavaScriptEnabled(true);
        if (androidJs != null)
            mWebView.addJavascriptInterface(androidJs, "androidJs");

        //显示WebView提供的缩放控件
        settings.setDisplayZoomControls(false);
        settings.setBuiltInZoomControls(false);
        //设置页面是否支持缩放
        settings.setSupportZoom(false);
        //设置文本的缩放倍数，默认为 100
        //webSettings.setTextZoom(2);

        //打开 WebView 的 storage 功能，这样 JS 的 localStorage,sessionStorage 对象才可以使用
        settings .setDomStorageEnabled(true);

        //打开 WebView 的 LBS 功能，这样 JS 的 geolocation 对象才可以使用
        //settings.setGeolocationEnabled(true);
        // settings.setGeolocationDatabasePath("");

        //设置是否打开 WebView 表单数据的保存功能
        //settings.setSaveFormData(true);

        //设置 WebView 的默认 userAgent 字符串
        //settings.setUserAgentString("");

        //设置 WebView 的字体，可以通过这个函数，改变 WebView 的字体，默认字体为 "sans-serif"
        //settings.setStandardFontFamily("");
        //设置 WebView 字体的大小，默认大小为 16
        //settings.setDefaultFontSize(20);
        //设置 WebView 支持的最小字体大小，默认为 8
        //settings.setMinimumFontSize(12);

        //设置 JS 是否可以打开 WebView 新窗口
        settings.setJavaScriptCanOpenWindowsAutomatically(true);

        //被这个 tag 声明的宽度将会被使用，如果页面没有这个 tag 或者没有提供一个宽度，那么一个宽型 viewport 将会被使用。
        settings.setUseWideViewPort(true);

        settings.setPluginState(WebSettings.PluginState.ON);
        settings.setAllowFileAccess(true);
        settings.setLoadWithOverviewMode(true);

        settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
        settings.setCacheMode(WebSettings.LOAD_DEFAULT);
        saveData(settings);
        mMyWebChromeClient = new MyWebChromeClient();
        mWebView.setWebChromeClient(mMyWebChromeClient);

        //WebViewClient主要辅助WebView执行处理各种响应请求事件的
        mWebView.setWebViewClient(new WebViewClient() {

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                DLog.e("WebView开始加载");
            }

            // 链接跳转都会走这个方法
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                DLog.e("WebView加载路径：" + url);
                view.loadUrl(url);// 强制在当前 WebView 中加载 url

                return true;
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                DLog.e("WebView加载结束");
            }
        });

    }

    /**
     * 多窗口的问题
     */
    private void newWin(WebSettings mWebSettings) {
        //html中的_bank标签就是新建窗口打开，有时会打不开，需要加以下
        //然后 复写 WebChromeClient的onCreateWindow方法
        mWebSettings.setSupportMultipleWindows(false);
        mWebSettings.setJavaScriptCanOpenWindowsAutomatically(true);
    }

    /**
     * HTML5数据存储
     */
    private void saveData(WebSettings mWebSettings) {
        //有时候网页需要自己保存一些关键数据,Android WebView 需要自己设置
        mWebSettings.setDomStorageEnabled(true);
        mWebSettings.setDatabaseEnabled(true);
        mWebSettings.setAppCacheEnabled(true);
        String appCachePath = BaseApplication.getContext().getApplicationContext().getCacheDir().getAbsolutePath();
        mWebSettings.setAppCachePath(appCachePath);
    }

    private class MyWebChromeClient extends WebChromeClient {

        @Override
        public void onShowCustomView(View view, IX5WebChromeClient.CustomViewCallback callback) {
            super.onShowCustomView(view, callback);
        }

        public void onHideCustomView() {
            super.onHideCustomView();
        }
    }


    public void destroyX5() {
        if (mWebView != null) {
            mWebView.clearHistory();
            mWebView.loadUrl("about:blank");
            mWebView.stopLoading();
            mWebView.setWebChromeClient(null);
            mWebView.setWebViewClient(null);
            mWebView.destroy();
            mWebView = null;
        }

    }

    public static void clearAllCache(Context mContext) {
        //清除cookie
        CookieManager.getInstance().removeAllCookies(null);
        //清除storage相关缓存
        WebStorage.getInstance().deleteAllData();
        //清除用户密码信息
        WebViewDatabase.getInstance(mContext).clearUsernamePassword();
        //清除httpauth信息
        WebViewDatabase.getInstance(mContext).clearHttpAuthUsernamePassword();
        //清除表单数据
        WebViewDatabase.getInstance(mContext).clearFormData();
        //清除页面icon图标信息
        WebIconDatabase.getInstance().removeAllIcons();
        //删除地理位置授权，也可以删除某个域名的授权（参考接口类）
        GeolocationPermissions.getInstance().clearAll();

        //一次性删除所有缓存 清除cookie
        //QbSdk.clearAllWebViewCache(mContext, true);
    }
}
